import axios, { AxiosRequestConfig } from 'axios';
import appConfig from '@/config'

// 声明类型扩展
declare module 'axios' {
  interface AxiosRequestConfig {
    silent?: boolean  // 静默模式标识
  }
}

// 创建实例
const instance = axios.create({
  baseURL: appConfig.baseUrl,
  timeout: 1000*60*10,  // 10 min
  headers:{
    "Access-Token": appConfig.apiToken,
  },
})

let reqList =  []

// 添加请求拦截器
instance.interceptors.request.use(
  async config => {
    // 若不是静默请求，则开启loading
    if (!config?.silent) {
      const storeApp = (await import('@/stores/app')).default()
      storeApp.startLoading();
    }

    // 当前请求
    const request = JSON.stringify(config)

    //如果当前已经在请求了，则不再处理
    if(!reqList.includes(request))
    {
      reqList.push(request)
    }

    //TODO: 暂定Token处理
    // const userToken = store.getters.token
    // if(userToken){
    //   config.headers['Authorization'] = 'Bearer'+ userToken
    // }
    return config
  },
  async error =>{
    // 出现错误时，若不是静默请求，则关闭loading
    if (!error.config?.silent) {
      const storeApp = (await import('@/stores/app')).default()
      storeApp.endLoading();
    }

    return error
  }
)

// 添加响应拦截器
instance.interceptors.response.use(
  async response => {
    // 若不是静默请求，则关闭loading
    if (!response.config?.silent) {
      const storeApp = (await import('@/stores/app')).default()
      storeApp.endLoading();
    }

    // 从请求列表中移除结束的
    reqList.splice(reqList.findIndex(item=>item===JSON.stringify(response.config)),1)

    // 若没有配置skipResponseCheck=true，则校验响应结果的错误码
    if (!response.config?.skipResponseCheck) {
      if (response.data?.code === '6') { 
        // token失效，则跳转到登陆页面
        window.location.href = appConfig.scnetLogin;
      };
    }

    return response
  },
  async error =>{
    // 出现错误时，若不是静默请求，则关闭loading
    if (!error.config?.silent) {
      const storeApp = (await import('@/stores/app')).default()
      storeApp.endLoading();
    }

    //发生异常，清空请求列表
    reqList.length = 0 

    return error
  }
)

export default instance